<?php
/**
 * Here is your custom functions.
 */


use support\Response;
use \support\Db;

if (!function_exists('checkenv')) {
    /**
     * 检测环境变量
     */
    function checkenv(): array
    {
        $items = [];
        $items['php'] = PHP_VERSION;
        $items['mysqli'] = extension_loaded('mysqli');
        $items['redis'] = extension_loaded('redis');
        $items['curl'] = extension_loaded('curl');
        $items['fileinfo'] = extension_loaded('fileinfo');
        $items['exif'] = extension_loaded('exif');
        $items['gd'] = extension_loaded('gd');

        return $items;
    }
}

if (!function_exists('success')) {
    /**
     * api返回
     */
    function success($data = []): Response
    {
        return Response::success($data);
    }
}

if (!function_exists('message')) {

    /**
     * 消息数组函数
     * @param array $data 结果数据
     * @param int $code 错误码
     * @param string $msg 提示语
     * @return array 返回消息对象
     */
    function message(array $data = [], int $code = 20000, string $msg = "操作成功")
    {
        $result['code'] = $code;
        $result['msg'] = $msg;
        $result['data'] = $data;
        return $result;
    }
}

if (!function_exists('error')) {
    /**
     * 错误返回json
     * @param $code int 状态码
     * @param $message string  消息提醒
     * @param array $data 结果数据
     * @param array $track 报错信息
     * @return Response
     */
    function error(int $code, string $message, array $data = [], array $track = [])
    {
        $return_data['code'] = $code ?: -1;
        $return_data['msg'] = $message ?: 'Server internal error';
        $return_data['data'] = $data;
        $return_data['track'] = $track;
        return json($return_data);
    }
}

if (!function_exists('array_key_value')) {

    /**
     * 获取数组中某个字段的所有值
     * @param array $arr 数据源
     * @param string $name 字段名
     * @return array 返回结果
     */
    function array_key_value(array $arr, string $name = "")
    {
        $result = [];
        if (!$arr) return $result;
        foreach ($arr as $key => $val) {
            if ($name) {
                $result[] = $val[$name];
            } else {
                $result[] = $key;
            }
        }
        return array_unique($result);
    }
}

if (!function_exists('toArray')) {

    /**
     * 对象转数组
     */
    function toArray($obj)
    {
        return json_decode(json_encode($obj), true);
    }
}

if (!function_exists('get_password')) {

    /**
     * 获取双MD5加密密码
     * @param string $password 加密字符串
     * @return string 返回结果
     * @date 2019/4/5
     */
    function get_password($password): string
    {
        return md5(md5($password));
    }
}


if (!function_exists('getConfig')) {
    /**
     * 通过分组获取系统配置
     */
    function getConfig($code)
    {
        if (!$code) return [];
        $config = \support\Model\ConfigModel::where('code', $code)->first();
        if (!$config) return [];
        $config_data = \support\Model\ConfigDataModel::where('config_id', $config->id)->pluck('value', 'code');
        return toArray($config_data);
    }
}
if (!function_exists('getDict')) {
    /**
     * 通过分组获取系统字段
     */
    function getDict($code)
    {
        if (!$code) return [];
        $dict = \support\Model\DictModel::where('code', $code)->first();
        if (!$dict) return [];
        $dict_data = \support\Model\DictDataModel::where('dict_id', $dict->id)->pluck('name', 'code');
        return toArray($dict_data);
    }
}

if (!function_exists('getDictLabel')) {
    /**
     * 通过分组获取系统字段
     */
    function getDictLabel($code)
    {
        if (!$code) return [];
        $dict = \support\Model\DictModel::where('code', $code)->first();
        if (!$dict) return [];
        $dict_data = \support\Model\DictDataModel::select([Db::raw('name as label'), Db::raw('code as value')])->where('dict_id', $dict->id)->get();
        return toArray($dict_data);
    }
}

if (!function_exists('getDictData')) {
    /**
     * 通过编码获取系统配置
     */
    function getDictData($code)
    {
        if (!$code) return [];
        $value = \support\Model\ConfigDataModel::where('code', $code)->value('value');
        return $value ?? '';
    }
}


if (!function_exists('getConfByType')) {

    /**
     * 获取系统上传方式
     */
    function getConfByType($type): array
    {
        $config['store_way'] = 'local';
        return $config;
    }
}


if (!function_exists('createTreeList')) {
    /**
     * 树map
     */
    function createTreeList($pid, $arr, &$tree = [])
    {
        foreach ($arr as $key => $vo) {
            if ($vo['pid'] == $pid) {
                $c = createTreeList($vo['id'], $arr);
                if ($c) {
                    $vo['children'] = $c;
                }
                $tree[] = $vo;
            }
        }
        return $tree;
    }
}

if (!function_exists('toDate')) {
    /**
     * 时间戳转日期
     * @param int $time 时间戳
     * @return string
     * @since 2025/01/04
     * @author zhc
     */
    function toDate(int $time): string
    {
        if (!$time) return '';
        return date('Y-m-d', $time);

    }
}

if (!function_exists('siteUrl')) {
    /**
     * 图片地址拼接
     * @param string $url
     * @param string $url
     * @return string
     * @since 2025/01/04
     * @author zhc
     */
    function siteUrl(string $url, string $adapter = 'local'): string
    {
        if (empty($url)) return $url;
        if ($adapter == 'local') {
            if (strstr($url, 'https://') || strstr($url, 'http://')) return $url;
            $forwarded = 'http://';
            if (request()->header('x-forwarded-proto')) $forwarded = request()->header('x-forwarded-proto') . '://';
            return $forwarded . request()->host() . (str_starts_with($url, '/') ? $url : '/' . $url);
        }
        return $url;
    }
}


if (!function_exists('get_os')) {
    /**
     * 获取操作系统
     * @return string
     * @since 2025/01/04
     * @author bh
     */
    function get_os($header): string
    {
        if (!empty($header['user-agent'])) {
            $os = $header['user-agent'];
            if (preg_match('/win/i', $os)) {
                $os = 'Windows';
            } else if (preg_match('/mac/i', $os)) {
                $os = 'MAC';
            } else if (preg_match('/linux/i', $os)) {
                $os = 'Linux';
            } else if (preg_match('/unix/i', $os)) {
                $os = 'Unix';
            } else if (preg_match('/bsd/i', $os)) {
                $os = 'BSD';
            } else {
                $os = 'Other';
            }
            return $os;
        } else {
            return 'unknow';
        }
    }
}

if (!function_exists('get_browse')) {
    /**
     * 获取浏览器信息
     * @param $header
     * @return string
     * @since 2025/01/04
     * @author bh
     */
    function get_browse($header): string
    {
        if (!empty($header['user-agent'])) {
            $br = $header['user-agent'];
            if (preg_match('/MSIE/i', $br)) {
                $br = 'MSIE';
            } else if (preg_match('/Firefox/i', $br)) {
                $br = 'Firefox';
            } else if (preg_match('/Chrome/i', $br)) {
                $br = 'Chrome';
            } else if (preg_match('/Safari/i', $br)) {
                $br = 'Safari';
            } else if (preg_match('/Opera/i', $br)) {
                $br = 'Opera';
            } else {
                $br = 'Other';
            }
            return $br;
        } else {
            return 'unknow';
        }
    }
}

if (!function_exists('ip_to_address')) {
    /**
     *  根据ip获取地址信息
     * @param $ip
     * @return string
     * @throws Exception
     * @since 2025/01/04
     * @author bh
     */
    function ip_to_address($ip): string
    {
        if (empty($ip)) return '';
        $ip2region = new \Ip2Region();
        $info = $ip2region->btreeSearch($ip);
        $info = explode('|', $info['region']);
        $address = '';
        foreach ($info as $vo) {
            if ('0' !== $vo) {
                $address .= $vo . '-';
            }
        }

        return rtrim($address, '-');
    }
}

if (!function_exists('multiSortArray')) {
    /**
     *  二位数组排序
     * @param array $data array 排序数据
     * @param string $name 排序字段
     * @param int $sort
     * @return array
     * @since 2025/01/04
     * @author bh
     */
    function multiSortArray(array $data, string $name, int $sort = SORT_ASC): array
    {
        if (empty($data)) return $data;
        //提取出要排序的键的值，放入临时数组中
        $names = array_column($data, $name);
        array_multisort($names, $sort, $data);
        return $data;
    }
}
